#ifndef __FUNC_H__
#define __FUNC_H__

#include "head.h"

// 小火车的总长度

// //接收发送缓冲区大小
// #define BUF_SIZE 1024
// //命令中最多有几个参数
// #define MAX_WORDNUM 8
// //命令一个参数的最大长度
// #define MAX_WORDLEN 30
// //100 M
// #define HUNDRED_MEGABYTE 104857600


// //套接字类型
// typedef int socket_t;

// //传输车
// typedef struct {
//     int _data_len;//车头，表示数据长度
//     char _data[BUF_SIZE];//车厢，表示数据
// }Train_t, *pTrain_t;

// //命令类型
// typedef struct {
//     int _argc;       //命令中有几个参数
//     char _cmd[MAX_WORDNUM][MAX_WORDLEN];
// }Cmd_t, *pCmd_t;

int conf_get(char *conf, char *ip, char *port);//从配置文件中获取参数
int tcp_connect(char *ip, char *port);//连接服务器
// int user_login(socket_t fd_server, pTrain_t pT); //如果登录成功返回1，失败返回0

// int init_cmd(char *buf, pCmd_t pcmd); //将line分割，存入cmd
// int cmd_check(pCmd_t pcmd); 
// int print_cmd(pCmd_t pcmd); //打印命令

// int get_filesize(char *filename); //获取文件大小
// int recv_file_train(int fd_socket, char *filename); //小于100M的接收方式
// int recv_file_mmap(int fd_socket, char *filename, off_t filesize); //大于100M，用mmap接收
// int send_file_sendfile(int fd_socket, char *filename, int filesize); //文件大于100M, 用sendfile发送文件
// int send_file_train(int fd_socket, char *filename);//小于100M的发送方式

typedef enum {
    CMD_TYPE_PWD=1,
    CMD_TYPE_LS,
    CMD_TYPE_CD,
    CMD_TYPE_MKDIR,
    CMD_TYPE_RMDIR,
    CMD_TYPE_PUTS,
    CMD_TYPE_GETS,
    CMD_TYPE_REMOVE,
    CMD_TYPE_NOTCMD,  //不是命令

    //user login
    CMD_TYPE_LOGIN_USRNAME = 100,
    CMD_TYPE_REGISTER_USERNAME,    
    CMD_TYPE_LOGIN_ENCRYTPTEDCODE,
    CMD_TYPE_REGISTER_ENCRYTPTEDCODE,
    MSG_TYPE_LOGIN_SALT,
    MSG_TYPE_REGISTER_SALT,
    MSG_TYPE_LOGINOK,
    MSG_TYPE_LOGINERROR,
    MSG_TYPE_REGISTEROK,
    MSG_TYPE_REGISTERERROR,

}CmdType;


//1.用户注册表
typedef struct User_s{
    int id;
    char userName[64];
    char salt[64];
    char cryptpasswd[65];
    char pwd[64];
}User_t;


typedef struct 
{
    int len;//记录内容长度
    CmdType type;//消息类型
    User_t user;  //对应用户信息
    char buff[1000];//记录内容本身
}train_t;

//int tcpConnect(const char * ip, unsigned short port);
// int recvn(int sockfd, void * buff, int len);
// int sendn(int sockfd, const void * buff, int len);

//登录和注册，0成功，1失败
int login_client(int sockfd, User_t* user);
int register_client(int sockfd);

int receive_response(int sockfd, char *response);
int encrypt_password(const char *password, const char *salt, char *encrypted_password);

//命令解析
int parseCommand(const char * input, int len, train_t * pt, User_t* user);


//执行上传文件操作
int putsCommand(int sockfd, train_t * pt);
int generateMD5(const char *filename, char *md5String);
//从服务器下载文件
int getsCommand(int sockfd, train_t * pt);
//监听事件
int addEpollReadfd(int epfd, int fd);
int delEpollReadfd(int epfd, int fd);
//大文件传输
int transferFile(int sockfd);

//登录模块
int login_view(int sockfd, User_t* user);

// 去除空格
int removeTrailingSpace(char* str);

// 解析命令，分割等
int splitString(const char *pstr, const char * delimiter, char *ptokens[], int max_tokens, int * pcount);
int freeStrs(char * pstrs[], int count);
#endif


